const db = require('../db/index')

// 入库：
// product_id 入库编号
// product_name 产品名称
// product_category 产品类别
// product_unit 产品单位
// product_in_warehouse_number 产品入库数量
// product_single_price 产品入库单价
// product_all_price 产品入库总价
// product_status 库存状态 100-300为正常 100以下为库存告急 300以上为过剩
// product_create_person 入库操作人
// product_create_time 产品创建时间
// product_update_time 产品最新编辑时间
// in_memo 入库备注

// 出库：
// product_out_id 出库编号
// product_out_number 出库数量
// product_out_price 出库总价
// product_out_apply_person 出库申请人
// product_apply_time 申请出库时间
// apply_memo 申请备注
// product_out_status 出库状态 申请出库 or 同意 or 否决
// product_audit_time 审核时间
// product_out_audit_person 审核人
// audit_memo 出库/审核备注


// 入库产品 参数：产品编号 产品名称 产品类别 产品单位 产品入库数量 产品单价  产品总价 入库操作人 入库备注 创建时间                                  
exports.InProduct = (req, res) => {
  const {
    product_id,
    product_name,
    product_category,
    product_unit,
    product_in_warehouse_number,
    product_single_price,
    product_create_person,
    in_memo
  } = req.body
  const product_create_time = new Date()
  const product_all_price = product_in_warehouse_number * product_single_price
  // 判断 产品是否已存在
  const sql = `select * from product where product_id = ?`
  db.query(sql, product_id, (err, results) => {
    if (err) return res.cc(err)
    if (results.length > 0) return res.cc('产品已存在', 1)
    // 入库
    const sql2 = `insert into product set  ?`
    db.query(sql2, {
      product_id,
      product_name,
      product_category,
      product_unit,
      product_in_warehouse_number,
      product_single_price,
      product_all_price,
      product_create_person,
      product_create_time,
      in_memo,
    }, (err, results) => {
      if (err) return res.cc(err)
      res.cc('入库成功', 0)
    })

  })
}


// 编辑产品信息 参数: 产品ID 产品名称 产品类别 产品单位 产品入库数量 产品单价  产品总价 入库备注 编辑时间
exports.EditProduct = (req, res) => {
  const {
    id,
    product_name,
    product_category,
    product_unit,
    product_in_warehouse_number,
    product_single_price,
    in_memo
  } = req.body
  const product_update_time = new Date()
  const product_all_price = product_in_warehouse_number * product_single_price
  const sql = `update product set ? where id = ?`
  db.query(sql, [{
    product_name,
    product_category,
    product_unit,
    product_in_warehouse_number,
    product_single_price,
    product_all_price,
    product_update_time,
    in_memo,
  }, id], (err, results) => {
    if (err) return res.cc(err)
    res.cc('编辑产品成功', 0)
  })

}


// 删除产品 参数: 产品ID  
exports.DeleteProduct = (req, res) => {
  const { id } = req.body
  const sql = `delete from product where id = ?`
  db.query(sql, id, (err, results) => {
    if (err) return res.cc(err)
    res.cc('删除产品成功', 0)
  })
}


// 获取产品列表 参数: 无  --- 只要产品数量 > 0 就是 有库存
exports.GetProductList = (req, res) => {
  const sql = `select * from product where product_in_warehouse_number > 0`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取产品列表成功',
      data: results
    })
  })
}

// 产品申请出库 参数: 产品ID 产品出库ID 产品出库状态 产品单价 产品出库数量 产品出库申请人 申请备注 申请时间
exports.ApplyProductOut = (req, res) => {
  const product_out_status = '申请出库'
  const {
    id,
    product_out_id,
    product_single_price,
    product_out_number,
    product_out_apply_person,
    apply_memo
  } = req.body
  const product_apply_time = new Date()
  const product_out_price = product_out_number * product_single_price
  // 判断此产品是否已申请
  const sql = `select * from product where product_out_id = ?`
  db.query(sql, product_out_id, (err, results) => {
    if (err) return res.cc(err)
    // if (results.length > 0) return res.cc('此产品已申请出库', 1)
    const sql2 = `update product set ? where id = ?`
    db.query(sql2, [{
      product_out_id,
      product_out_status,
      product_out_number,
      product_out_price,
      product_out_apply_person,
      product_apply_time,
      apply_memo
    }, id], (err, results) => {
      if (err) return res.cc(err)
      res.cc('申请出库成功', 0)
    })
  })
}


// 获取正在申请中的列表 参数: 无 ---- 只要是 product_out_status 不为 同意 都是 审核中的产品
exports.GetProductApplyitList = (req, res) => {
  const sql = `select * from product where product_out_status not in ('同意') `
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取正在申请中的列表成功',
      data: results
    })
  })
}

// 产品审核 参数： 产品ID , 产品出库ID, 产品出库状态, 产品审核备注, 产品出库价格, 产品申请人, 产品审核人, 产品入库数量, 产品出库数量, 产品单价, 产品申请出库时间, 产品审核决定
// 逻辑: 
// 如果前端传来的产品出库状态是同意, 那么更新产品表中的数量和价格, 再把申请出库的一些内容置空
// 如果前端传来的产品出库状态是否决, 那么把审核备注, 审核人, 审核时间, 以及产品出库状态(否决) 更新到产品表中
exports.AuditProduct = (req, res) => {
  const {
    id,
    product_name,
    product_in_warehouse_number,
    product_single_price,
    product_out_id,
    product_out_status,
    product_out_price,
    product_out_apply_person,
    product_out_number,
    product_apply_time,
    product_out_audit_person,
    audit_memo
  } = req.body
  const product_audit_time = new Date()
  if (product_out_status === '同意') {
    const newWarehouseNumber = product_in_warehouse_number - product_out_number
    const newAllPrice = newWarehouseNumber * product_single_price
    const sql = `insert into outproduct set ?`
    db.query(sql, {
      product_name,
      product_out_id,
      product_out_price,
      product_out_apply_person,
      product_out_number,
      product_apply_time,
      audit_memo,
      product_out_audit_person,
      product_audit_time
    }, (err, results) => {
      if (err) return res.cc(err)
      // 更新产品表的信息
      const sql2 = `update product set 
                    product_out_status = NULL,
                    product_out_id = NULL,
                    product_out_number = NULL,
                    apply_memo = NULL,
                    product_out_price = NULL,
                    product_apply_time = NULL, 
                    product_in_warehouse_number = ?,
                    product_all_price = ?
                    where id = ?`
      db.query(sql2, [newWarehouseNumber, newAllPrice, id], (err, results) => {
        if (err) return res.cc(err)
        res.cc('审核成功, 产品已出库', 0)
      })
    })
  }
  if (product_out_status === '否决') {
    const sql = `update product set ? where id =?`
    db.query(sql, [{
      product_out_status,
      product_out_audit_person,
      product_audit_time,
      audit_memo
    }, id], (err, results) => {
      if (err) return res.cc(err)
      res.cc('审核已否决, 出库失败', 0)
    })
  }
}

// 对产品进行撤回申请
exports.WithdrawApplyProduct = (req, res) => {
  const sql = `update product set product_out_id = NULL,product_out_status = NULL , product_out_number =NULL,product_out_apply_person=NULL,apply_memo =NULL,product_out_price =NULL,product_apply_time = NULL where id = ?`
  db.query(sql, req.body.id, (err, result) => {
    if (err) return res.cc(err)
    res.cc('撤回申请成功', 0)
  })
}


// 通过入库编号对产品进行搜索 参数： 入库编号 : product_id
exports.SearchProductByProductId = (req, res) => {
  const sql = `select * from product where product_id = ?`
  db.query(sql, req.body.product_id, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取产品信息成功',
      data: result
    })
  })
}

// 通过出库编号对产品进行搜索 参数： 出库编号 product_out_id
exports.SearchProductByProductOutId = (req, res) => {
  const sql = 'select * from outproduct where product_out_id   = ?'
  db.query(sql, req.body.product_out_id, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取产品信息成功',
      data: result
    })
  })
}

// 获取产品总数 参数: 无 ---- 只要 product_in_warehouse_number>= 0 的
exports.GetProductTotal = (req, res) => {
  const sql = 'select count(*) as total from product where product_in_warehouse_number >= 0'
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取产品总数成功',
      data: results[0].total
    })
  })
}

// 获取正在申请出库中的产品总数 参数: 无 ---- 只要 product_out_status = '申请出库' or product_out_status = "否决" 的情况就是申请出库的产品
exports.GetApplyProductTotal = (req, res) => {
  const sql = `select count(*) as total from product where product_out_status = '申请出库' or product_out_status = "否决"`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取申请出库的产品总数成功',
      data: results[0].total
    })
  })
}

// 出库成功的产品列表 参数: 无
exports.GetProductOutList = (req, res) => {
  const sql = `select * from outproduct`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取出库成功的产品列表成功',
      data: results
    })
  })
}

// 获取出库成功的产品总数 参数: 无
exports.GetProductOutTotal = (req, res) => {
  const sql = `select count(*) as total from outproduct`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取出库成功的产品总数成功',
      data: results[0].total
    })
  })
}

// 根据页码获取 所有产品 数据 参数: 页码: pager
exports.GetProductListByPager = (req, res) => {
  const pager = (req.body.pager - 1) * 5 // 0 5 10 15 20
  const sql = `select * from product  
  where product_in_warehouse_number >= 0
  order by product_create_time asc
  limit 5 offset ${pager}`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: `获取第${req.body.pager}页产品列表成功`,
      data: results
    })
  })
}

// 根据页码获取 申请出库的产品 数据 参数: 页码: pager
exports.GetApplyProductListByPager = (req, res) => {
  const pager = (req.body.pager - 1) * 5 // 0 5 10 15 20
  const sql = `select * from product  
  where product_out_status = "申请出库" || product_out_status = "否决"
  order by product_apply_time asc
  limit 5 offset ${pager}`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: `获取第${req.body.pager}页申请出库产品列表成功`,
      data: results
    })
  })
}

// 根据页码获取 出库成功的产品 数据 参数: 页码 pager
exports.GetProductOutListByPager = (req, res) => {
  const pager = (req.body.pager - 1) * 5 // 0 5 10 15 20
  const sql = `select * from outproduct order by product_audit_time limit 5 offset ${pager}`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: `获取第${req.body.pager}页出库成功产品列表成功`,
      data: results
    })
  })
}


// 获取产品类别
exports.GetProductCate = (req, res) => {
  const sql = `select distinct product_category from product`
  db.query(sql, (err, results) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取产品类别成功',
      data: results
    })
  })
}